package 链表;

import java.util.Iterator;
import java.util.Spliterator;
import java.util.function.Consumer;

public class Node1 implements Iterable<Integer>{
    Node head;

    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            Node p=head;
            @Override
            public boolean hasNext() {
                return p!=null;//是否有没有下一个元素
            }
            @Override
            public Integer next() {//返回当前值，并且指向下一个
                int V=p.value;
                p=p.next;
                return V;
            }
        };
    }

    static class Node{
        int value;
        Node next;
        public Node(int value,Node next){
            this.next=next;
            this.value=value;
        }
    }
    public void addFirst(int value){
        head=new Node(value,head);//头指针不存储数据
    }
    public void loop1(){
        Node  p=head;
        while (p!=null){
            System.out.println(p.value);
            p=p.next;
        }
    }
    public  void loop2(Consumer<Integer>consumer){//利用接口实现方法的多种使用
        Node p=head;
        while (p!=null){
            consumer.accept(p.value);
            p=p.next;
        }
    }
    public void loop3(Consumer<Integer>consumer) {//利用for循环
;
        for (Node p = null; p != null; p = p.next) {
            consumer.accept(p.value);
        }
    }
      public Node findLast(){//p.next的不为null时才可以
       if (head==null){
           return null;
       }
       Node p;
        for(p=head;p.next!=null;p=p.next){
        }
        return p;
      }
      public void addLast(int value){
        Node last=findLast();
        if(last==null){
            addFirst(value);
            return;
        }
        last.next=new Node(value,null);
      }
      public void test(){
        int i=0;
        for(Node p=head;p!=null;p=p.next,i++){
            System.out.println(p.value+"索引是"+i);
        }
      }
      public Node findnode(int index){
        int i=0;
        for(Node p=head;p!=null;p=p.next,i++){
            if(i==index){
                return p;
            }
        }
        return null;
      }
      public int get(int index) throws IllegalArgumentException{//承载相应接口，不符合条件时则抛出不合法
        Node node=findnode(index);
        if(node==null){
           throw  new IllegalArgumentException(
            String.format("index [%d] 不合法%n",index));
        }
        return node.value;
      }
      public void insert(int value,int index)throws IllegalArgumentException{//承载接口
        if(index==0){
            addFirst(value);
        }
          Node pre=findnode(index-1);
          if(pre==null){//为空时抛出不合法
            throw new IllegalArgumentException(
                    String.format("index[%d] 不合法",index)
            );
        }
            pre.next=new Node(value,pre.next);
      }
      public void removeFirst()throws IllegalArgumentException{
        if(head==null){
            throw new IllegalArgumentException(
                    String.format("index[%d] 不合法")
            );
        }
        head=head.next;//head的next指向next代替旧的
      }

    public void remove(int index){
          if(index==0){
              removeFirst();
              return;
          }
          Node pre=findnode(index-1);
          if(pre==null){
              throw new IllegalArgumentException(
                      String.format("index[%d] 不合法")
              );
          }
          Node removed=pre.next;
          if(removed==null){
              throw new IllegalArgumentException(
                      String.format("index[%d] 不合法")
              );
          }
          pre.next=removed.next;
      }

    }



